package aerolinea;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;

import ubicacionEnAvion.Centro;
import ubicacionEnAvion.Pasillo;
import ubicacionEnAvion.UbicacionEnAvion;
import ubicacionEnAvion.Ventana;
import usuario.Usuario;
import asiento.Asiento;
import asiento.Disponible;
import asiento.Reservado;
import busqueda.Busqueda;
import claseAsiento.ClaseAsiento;
import claseAsiento.Ejecutiva;
import claseAsiento.PrimeraClase;
import claseAsiento.Turista;

import com.oceanic.AerolineaOceanic;
import com.oceanic.AsientoDTO;

import excepciones.NoPuedeComprarException;
import excepciones.NoPuedeReservarException;
import formatos.Latino;

public class OceanicAdapter extends Aerolinea{
	
	
	private AerolineaOceanic instance;
	
	
	public Collection<Asiento> getAsientosDisponibles(Busqueda busqueda) {
	    
	        if (busqueda.getDestino() == null){
	        
	            return this.parsearAsientos(this.getInstance().asientosDisponiblesParaOrigen(busqueda.getOrigen(), busqueda.getFechaSalida()), busqueda);
	        }
	        else {
	  
	            return this.parsearAsientos(this.getInstance().asientosDisponiblesParaOrigenYDestino(busqueda.getOrigen(), busqueda.getDestino(), busqueda.getFechaSalida()), busqueda);
	        }
	}

	public Collection<Asiento> parsearAsientos(Collection<AsientoDTO> asientosAParsear, Busqueda busqueda){
        Collection<Asiento> asientosParseados = new ArrayList<Asiento>();
    	      
		for (AsientoDTO asientoAParsear : asientosAParsear)
            asientosParseados.add(parsearAsiento(asientoAParsear, busqueda));
		
	    return asientosParseados;
	}
	   
	    public Asiento parsearAsiento(AsientoDTO asientoAParsear, Busqueda busqueda){
	       
	        Asiento asientoParseado = new Asiento();
	        Latino latino = new Latino();
	       
	            asientoParseado.setCodigoAsiento(asientoAParsear.getCodigoDeVuelo());
	            asientoParseado.setNumeroAsiento(asientoAParsear.getNumeroDeAsiento().toString());
	            asientoParseado.setPrecio(asientoAParsear.getPrecio().add(busqueda.getTipoUsuario().getRecargo()));
	            asientoParseado.setClaseAsiento(this.parsearClaseAsiento(asientoAParsear.getClase()));
	            asientoParseado.setUbicacionEnAvion(this.parsearUbicacionAsiento(asientoAParsear.getUbicacion()));
	            if (asientoAParsear.getReservado()){
	            	asientoParseado.setEstado(new Reservado());
	            }
	            else{
	            	asientoParseado.setEstado(new Disponible());
	            }
	            
	            try{
	            	asientoParseado.setFechaSalida(latino.convertir(asientoAParsear.getFechaDeSalida()));           
		            asientoParseado.setFechaLlegada(latino.convertir(asientoAParsear.getFechaDeLlegada()));
		        }catch (ParseException pe){
	    			System.out.println("error al parsear una fecha del asiento");
	    		}
	            asientoParseado.setOrigen(asientoAParsear.getOrigen());
	            asientoParseado.setDestino(asientoAParsear.getDestino());
	           
	            return asientoParseado;
	    }

		private UbicacionEnAvion parsearUbicacionAsiento(String string) {
			if (string.equals("Pasillo")){
				return new Pasillo();
			}
			else {
				if (string.equals("Ventana")) return new Ventana();
				return new Centro();
			}
			
		}

		private ClaseAsiento parsearClaseAsiento(String string) {
			if (string.equals("Primera")){
				return new PrimeraClase();
			}
			else {
				if (string.equals("Turista")) return new Turista();
				return new Ejecutiva();
			}
		}


		@Override
		public void comprarAsiento(Asiento asiento, Usuario usuario) throws NoPuedeComprarException {
			
			if(asiento.getEstado().sePuedeComprarElAsiento(usuario)){
			
				this.getInstance().comprarSiHayDisponibilidad(usuario.getDni(), asiento.getCodigoAsiento(),Integer.parseInt(asiento.getNumeroAsiento()));
		}
			else throw new NoPuedeComprarException("No se puede realizar la compra del asiento solicitado");
		}

		@Override
		public void reservarAsiento(Asiento asiento, Usuario usuario) throws NoPuedeReservarException {
			
			if (asiento.getEstado().sePuedeReservar()){
				this.getInstance().reservar(usuario.getDni(), asiento.getCodigoAsiento(), Integer.parseInt(asiento.getNumeroAsiento()));
			}
			else throw new NoPuedeReservarException("No se puede realizar la reserva del asiento solicitado");
		}

		@Override
		public String extraerCodigoVuelo(String codigoAsiento) {
			
			return codigoAsiento;
		}

		public void setInstance(AerolineaOceanic instance) {
			this.instance = instance;
		}

		public AerolineaOceanic getInstance() {
			if (instance == null){
				instance = AerolineaOceanic.getInstance();
			}
			return instance;
		}

}
